package guard.finder;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import guard.finder.objetos.eventos;
import guard.finder.objetos.implicados;
import guard.finder.objetos.reporte;
import guard.finder.utils.conexionWS;
import guard.finder.utils.implicados_adapter;
import guard.finder.utils.utils;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Spinner;

public class report extends Activity {
	//Atributo donde se cargan todos los implicados.
	private ArrayList<implicados> implicados_data = new ArrayList<implicados>();
	private ArrayList<eventos> listaEventos = new ArrayList<eventos>();
	private static final int CAMERA_PIC_REQUEST = 1337; 
	byte[] byteArray;
	final utils util = new utils();
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.report);
        cargarEventos();
        Bundle bundle = getIntent().getExtras();
        //Obtener el nombre del usuario que inicio sesion.
        final String usuario= bundle.getString("usuario");
        final Button btnList = (Button)findViewById(R.id.btnListaImplicados);
        final Button btnAddList = (Button)findViewById(R.id.btnAgregarImplicado);
        final Button btnEnviarReporte = (Button)findViewById(R.id.enviarReporte);
        final Button btnCamara =(Button)findViewById(R.id.btnCamara);
        
        btnList.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mostrarImplicados();
			}
		});
        
        btnAddList.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				AlertDialog.Builder builder;
				AlertDialog alertDialog;
				LayoutInflater inflater = (LayoutInflater) report.this.getSystemService(LAYOUT_INFLATER_SERVICE);
				View layout = inflater.inflate(R.layout.add_implicado,
				                               (ViewGroup) findViewById(R.id.layout_root));
				builder = new AlertDialog.Builder(report.this);
				builder.setView(layout);
				builder.setPositiveButton("Agregar", new DialogInterface.OnClickListener() {
			        public void onClick(DialogInterface dialog, int whichButton) {
			        	Dialog source = (Dialog) dialog;
			        	EditText txtNombre = (EditText)source.findViewById(R.id.implicadoNombre);
			        	EditText txtCorreo = (EditText)source.findViewById(R.id.implicadoCorreo);
			        	agregarImplicado(txtNombre.getText().toString(),txtCorreo.getText().toString());
			          }
			        });
				builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
			        public void onClick(DialogInterface dialog, int whichButton) {
			        	dialog.dismiss();
			          }
			        });
				alertDialog = builder.create();				
				alertDialog.show();
			}
		});
        
        btnEnviarReporte.setOnClickListener(new OnClickListener() {
        	@Override
			public void onClick(View v) {
        		EditText edTxtLugar= (EditText)findViewById(R.id.txtLugarReporte);
    			EditText edTxtSector= (EditText)findViewById(R.id.txtSectorReporte);
    			EditText edTxtDescripcion= (EditText)findViewById(R.id.txtDescripcionReporte);
				eventos Evento = obtenerEvento();
				String lugar = edTxtLugar.getText().toString().trim();
				String sector = edTxtSector.getText().toString().trim();
				String descripcion = edTxtDescripcion.getText().toString().trim();
				if(Evento==null)
					util.mostrarMSG(report.this, "No se cargaron los eventos correctamente");
				else if("".equals(lugar) || "".equals(sector) || "".equals(descripcion)){
					util.mostrarMSG(report.this, "Hay datos sin completar");
				}
				else{
					ArrayList<implicados> implicadosLista = getImplicadosData();
					conexionWS servicio = new conexionWS();
					String resultado = servicio.crearReporte(new reporte(lugar, sector, descripcion, Evento, implicadosLista, getBiteArray(), usuario));
					if("true".equals(resultado))
						util.mostrarMSG(report.this, "Se ha registrado el reporte");
					else util.mostrarMSG(report.this, resultado);
				}				
			}
		});
        
        btnCamara.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				try {
					Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
					startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
				}
				catch (Exception exc){
					Log.e("Shit", exc.getMessage());
					}
			}
		});
    }
    
    private byte[] getBiteArray(){
    	return this.byteArray;
    }
    
    private void setByteArray(byte[] byteArray){
    	this.byteArray = byteArray;
    }
    
    public ArrayList<implicados> getImplicadosData(){
    	return this.implicados_data;
    }
    
    /**
     * Carga en el spinner la lista de eventos que el WS le envia.
     */
    private void cargarEventos() {
    	final Spinner spinner = (Spinner) findViewById(R.id.spinner1);
    	ArrayList<String> list = cargarListaEventos();
    	ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
    		android.R.layout.simple_spinner_item, list);
    	dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	spinner.setAdapter(dataAdapter);
    	}
    
    /**
     * Obtiene los eventos del WebService.
     * @return Retorna una lista con los nombres de los eventos. 
     */
    private ArrayList<String> cargarListaEventos(){
    	ArrayList<String> descripcionEventos = new ArrayList<String>();
    	conexionWS servicio= new conexionWS();
    	listaEventos = servicio.obtenerEventos(); 
    	for (Iterator<eventos> i = listaEventos.iterator(); i.hasNext(); ){
    		eventos event = i.next();
    		descripcionEventos.add(event.getEvento());
    	}
    	if(listaEventos.isEmpty()){
    		descripcionEventos.add("No se pudo cargar los eventos");
    	}
    	
    	return descripcionEventos;
    }

    /**
     * Busca el evento seleccionado en el spinner
     * @return null si no lo encuentra, sino retorna el evento.
     */
    private eventos obtenerEvento(){
    	final Spinner spinner = (Spinner) findViewById(R.id.spinner1);
    	String textoEvento = spinner.getSelectedItem().toString();
    	eventos Evento=null;
    	for(Iterator<eventos>iteratorEventos = listaEventos.iterator(); iteratorEventos.hasNext();){
    		eventos event = iteratorEventos.next();
    		if(textoEvento.equals(event.getEvento())){
    			Evento = new eventos(event.getId(),textoEvento);
    			break;
    		}
    	}
    	return Evento;
    }
    
	/**
     * Agrega un implicado a la lista de implicados
     * @param nombre El nombre del implicado.
     * @param email El email del mismo.
     */
    private void agregarImplicado(String nombre, String email){
    	if("".equals(nombre.trim()) || "".equals(email.trim())){
    		utils util = new utils();
    		util.mostrarMSG(report.this, "Hay espacios en blanco!");
    	}
    	else if(!implicados_data.isEmpty() && "No hay implicados".compareTo(implicados_data.get(0).getNombre())==0){
    		implicados_data.remove(0);
    		implicados_data.add(new implicados(nombre,email));
    	}
    	else implicados_data.add(new implicados(nombre,email));
    }
    
    /**
     * Mostrar en un listView la lista de implicados.
     * Esta lista esta formada por el nombre, email y un boton para eliminar el item.
     */
    private void mostrarImplicados(){
    	ListView modeList = new ListView(report.this);			
		implicados_adapter adapter = new implicados_adapter(report.this,
				R.layout.listview_item_row, implicados_data);
		adapter.setNotifyOnChange(true);
		View header = (View)getLayoutInflater().inflate(R.layout.list_view_title, null);
		modeList.addHeaderView(header);
		modeList.setAdapter(adapter);
		AlertDialog.Builder builder = new AlertDialog.Builder(report.this);
		builder.setView(modeList);
		Dialog dialog = builder.create();
		dialog.show();
    }
    
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
	    try{
		if (requestCode == CAMERA_PIC_REQUEST) {
	    	Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
	    	ByteArrayOutputStream stream = new ByteArrayOutputStream();
	    	thumbnail.compress(Bitmap.CompressFormat.PNG, 0, stream);
	    	setByteArray(stream.toByteArray());
	        ImageView image = (ImageView) findViewById(R.id.imageView1);
	        image.setImageBitmap(thumbnail);
	    }
	    }
		catch (Exception exc){
			Log.e("Shit", exc.getMessage());
		}
	}
    
}